﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Security.Cryptography;
using System.Configuration;
using System.IO;


namespace LogicStudio.HashEncode
{
    public class LogicStudioEncodeManager
    {
        const string DESKey = "AQWSEDRF";
        const string DESIV = "HGFEDCBA";

        string mensaje = string.Empty;

        [Browsable(true)]
        public string Mensaje
        {
            get { return mensaje; }
            set { mensaje = value; }
        }

        [Browsable(false)]
        public enum AlgoritmoEncriptacionHash
        {
            // SHA1,
            SHA256,
            //SHA384,
            //SHA512,
            MD5
        }


        AlgoritmoEncriptacionHash set;

        [Browsable(true)]
        public AlgoritmoEncriptacionHash ModoEncriptacionHash
        {
            get { return set; }
            set { set = value; }
        }


        public static string EncriptarMensaje(string Mensaje)
        {
            byte[] key;
            byte[] IV;
            string mensajeEncriptado = string.Empty;
            byte[] inputByteArray;
            try
            {
                string DESKey = ConfigurationManager.AppSettings["LlaveSeguridadEncriptacion"].ToString();
                string DESIV = ConfigurationManager.AppSettings["LlaveSeguridadIV"].ToString();

                key = Convert2ByteArray(DESKey);

                IV = Convert2ByteArray(DESIV);

                inputByteArray = Encoding.UTF8.GetBytes(Mensaje);
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);

                cs.FlushFinalBlock();

                mensajeEncriptado= Convert.ToBase64String(ms.ToArray());
            }

            catch (System.Exception ex)
            {

                //throw ex;
            }
            return mensajeEncriptado;
        }

        public static string DesencriptarMensaje(string MensajeDesencriptar)
        {
            byte[] key;
            byte[] IV;
            string mensajeDesencriptado = string.Empty;
            byte[] inputByteArray;
            try
            {
                string DESKey = ConfigurationManager.AppSettings["LlaveSeguridadEncriptacion"].ToString();
                string DESIV = ConfigurationManager.AppSettings["LlaveSeguridadIV"].ToString();


                key = Convert2ByteArray(DESKey);

                IV = Convert2ByteArray(DESIV);

                int len = MensajeDesencriptar.Length; inputByteArray = Convert.FromBase64String(MensajeDesencriptar);


                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                MemoryStream ms = new MemoryStream();

                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, IV), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);

                cs.FlushFinalBlock();

                Encoding encoding = Encoding.UTF8;
                mensajeDesencriptado= encoding.GetString(ms.ToArray());
            }

            catch (System.Exception ex)
            {

                //throw ex;
            }
            return mensajeDesencriptado;
        }

        static byte[] Convert2ByteArray(string strInput)
        {

            int intCounter; char[] arrChar;
            arrChar = strInput.ToCharArray();

            byte[] arrByte = new byte[arrChar.Length];

            for (intCounter = 0; intCounter <= arrByte.Length - 1; intCounter++)
                arrByte[intCounter] = Convert.ToByte(arrChar[intCounter]);

            return arrByte;
        }
        public static string EncriptarContraseña(string Contraseña)
        {
            string mensajeEncriptadoHash = string.Empty;

            try
            {
                byte[] keyArray;
                byte[] mensajeEncriptado = UTF8Encoding.UTF8.GetBytes(Contraseña);

                string llaveSeguridad = ConfigurationManager.AppSettings["LlaveSeguridadEncriptacionContraseñas"].ToString();
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(llaveSeguridad));
                hashmd5.Clear();

                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                tdes.Key = keyArray;
                tdes.Mode = CipherMode.ECB;
                tdes.Padding = PaddingMode.PKCS7;

                ICryptoTransform cTransform = tdes.CreateEncryptor();
                byte[] mensajeResultante = cTransform.TransformFinalBlock(mensajeEncriptado, 0, mensajeEncriptado.Length);
                tdes.Clear();
                mensajeEncriptadoHash = Convert.ToBase64String(mensajeResultante, 0, mensajeResultante.Length);
            }
            catch (Exception ex)
            { }

            return mensajeEncriptadoHash;
        }

        //public static string EncriptarMensaje(string Mensaje)
        //{

        //    string mensajeEncriptadoHash = string.Empty;

        //    try
        //    {
        //        byte[] keyArray;
        //        byte[] mensajeEncriptado = UTF8Encoding.UTF8.GetBytes(Mensaje);

        //        string llaveSeguridad = ConfigurationManager.AppSettings["LlaveSeguridadEncriptacion"].ToString();
        //        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        //        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(llaveSeguridad));
        //        hashmd5.Clear();

        //        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //        tdes.Key = keyArray;
        //        tdes.Mode = CipherMode.ECB;
        //        tdes.Padding = PaddingMode.PKCS7;

        //        ICryptoTransform cTransform = tdes.CreateEncryptor();
        //        byte[] mensajeResultante = cTransform.TransformFinalBlock(mensajeEncriptado, 0, mensajeEncriptado.Length);
        //        tdes.Clear();
        //        mensajeEncriptadoHash = Convert.ToBase64String(mensajeResultante, 0, mensajeResultante.Length);
        //    }
        //    catch (Exception ex)
        //    { }

        //    return mensajeEncriptadoHash;
        //}

        //public static string DesencriptarMensaje(string MensajeDesencriptar)
        //{
        //    string mensajeDesencriptadoHash = string.Empty;
        //    try
        //    {
        //        byte[] keyArray;
        //        byte[] mensajeEncriptado = Convert.FromBase64String(MensajeDesencriptar);

        //        string llaveSeguridad = ConfigurationManager.AppSettings["LlaveSeguridadEncriptacion"].ToString();
        //        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        //        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(llaveSeguridad));
        //        hashmd5.Clear();


        //        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //        tdes.Key = keyArray;
        //        tdes.Mode = CipherMode.ECB;
        //        tdes.Padding = PaddingMode.PKCS7;

        //        ICryptoTransform cTransform = tdes.CreateDecryptor();
        //        byte[] mensajeResultante = cTransform.TransformFinalBlock(mensajeEncriptado, 0, mensajeEncriptado.Length);

        //        tdes.Clear();
        //        mensajeDesencriptadoHash = UTF8Encoding.UTF8.GetString(mensajeResultante);
        //    }
        //    catch (Exception ex)
        //    { }
        //    return mensajeDesencriptadoHash;
        //}

    }
}
